import logging

from django.shortcuts import render
from rest_framework import status
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from django_redis import get_redis_connection
from rest_framework.permissions import IsAuthenticated

from course.models import Course, CourseExpire
from baizhiedu.settings import constants
from course.models import Course

# Create your views here.
# 获取日志记录
log = logging.getLogger("django")

from course.models import Course


# 购物车相关的处理
class CartViewSet(ViewSet):
    # 下面语句的作用,只有登录且认证通过的用户才能访问

    # permission_classes = [IsAuthenticated]  #此模块还是不要轻易用,在不清楚其内部原理的时候

    # 添加至购物车
    def add_cart(self, request):
        """
        将用户提交的信息添加进购物车
        :param request:  用户的id,课程id,勾选状态,有效期
        :return:
        """
        course_id = request.data.get("course_id")
        user_id = request.user.id  # request对象有user属性,认证通过的用户才有的
        print('111111')
        print(course_id)
        print(user_id)
        # 是否勾选
        select = True
        # 有效期
        expire = 0

        # 校验前段提交的额参数
        try:
            Course.objects.get(id=course_id)  # is_show可能会有问题
        except Course.DoesNotExist:
            return Response({"message": "参数有误,课程不存在"}, status=status.HTTP_400_BAD_REQUEST)

        try:
            # 获取redis连接对象
            redis_connection = get_redis_connection("cart")
            # 将数据保存到redis中
            pipeline = redis_connection.pipeline()
            # 开启管道(管道的作用在于可以一次性进行多次操作,节约时间,不用每次重新建立连接)
            pipeline.multi()
            # 将商品的信息以及对应的有效期存进去
            pipeline.hset("cart_%s" % user_id, course_id, expire)
            # 被勾选的商品信息
            pipeline.sadd("selected_%s" % user_id, course_id)
            # 开始执行数据
            pipeline.execute()
            # 获取存储的数量
            course_length = redis_connection.hlen("cart_%s" % user_id)
        except:
            log.error("购物车数据存储失败")
            return Response({"message": "参数有误,购物车添加失败"}, status=status.HTTP_507_INSUFFICIENT_STORAGE)

        return Response({"message": "购物车商品添加成功", "cart_length": course_length})

    # 展示购物车
    def list_cart(self, request):
        # course_id = request.data.get("course_id")
        user_id = request.data.get("course_id")
        # user_id = request.user.id  #这个东西在上面获取到的是空值,请注意,此时是有值的,但是结果不对
        print(user_id)
        redis_connection = get_redis_connection('cart')
        cart_list_bytes = redis_connection.hgetall("cart_%s" % user_id)
        # {b'29': b'0', b'3': b'0', b'28': b'0', b'24': b'0', b'18': b'0'},后者表示过期时间
        select_list_bytes = redis_connection.smembers("selected_%s" % user_id)
        # {b'28', b'3', b'24', b'18', b'29'}
        print("购物车的列表的信息展示")
        print(cart_list_bytes)
        print(select_list_bytes)

        # 循环从mysql找出商品的信息
        data = []
        for course_id_byte, expire_id_byte in cart_list_bytes.items():
            course_id = int(course_id_byte)
            expire_id = int(expire_id_byte)  # 过期时间
            # 商品信息
            print("商品")
            print(course_id)
            print(expire_id)
            try:
                course = Course.objects.get(pk=course_id)
            except Course.DoesNotExist:
                continue
            # 将购物车所需的信息返回
            data.append({
                "selected": True if course_id_byte in select_list_bytes else False,
                # 图片路径,这里需要注意的是,图片不能直接拼接,这里需要字符串,所以我们拿他的url路径即可
                "course_img": constants.IMAGE_SRC + course.course_img.url,
                "name": course.name,
                "id": course.id,
                "expire": expire_id,
                "price": course.price,
                # 设置购物车所选课程的有效期
                "expire_list": course.expire_list,
                # 获取真实价格
                "real_price": course.real_expire_price(expire_id),
            })

        return Response(data)

    # 切换购物车商品的状态
    def change_select(self, request):
        user_id = request.user.id  # 此数据可能获取不到

        selected = request.data.get("selected")
        course_id = request.data.get("course_id")
        try:
            Course.objects.get(pk=course_id)
        except Course.DoesNotExist:
            return Response({"message": "参数有误,当前购物车的商品不存在"}, status=status.HTTP_400_BAD_REQUEST)
        redis_connecton = get_redis_connection("cart")
        if selected:
            # 如果状态为选中,将商品添加至set中
            redis_connecton.sadd("selected_%s" % user_id, course_id)
        else:
            redis_connecton.srem("selected_%s" % user_id, course_id)
        return Response({"message": "操作成功"})

    # 切换课程有效期的状态
    def change_expire(self, request):
        """改变redis中课程的有效期"""
        user_id = request.user.id
        expire_id = request.data.get("expire_id")
        course_id = request.data.get("course_id")
        print(course_id, expire_id)

        try:
            course = Course.objects.get(id=course_id)
            # 如果前端传递来的有效期选项  如果不是0  则修改课程对应的有效期
            if expire_id > 0:
                expire_iem = CourseExpire.objects.filter(id=expire_id)
                if not expire_iem:
                    raise Course.DoesNotExist()
        except Course.DoesNotExist:
            return Response({"message": "课程信息不存在"}, status=status.HTTP_400_BAD_REQUEST)

        connection = get_redis_connection("cart")
        connection.hset("cart_%s" % user_id, course_id, expire_id)

        # 重新计算切换有效期后的价钱
        real_price = course.real_expire_price(expire_id)

        return Response({"message": "切换有效期成功", "real_price": real_price})

    # 获取购物车中已经勾选的商品,返回前段所需要的数量,,订单提交页面
    def get_select_course(self, request):
        user_id = request.user.id
        redis_connection = get_redis_connection("cart")
        # 获取当前登录用户的购物车中的所有商品
        cart_list = redis_connection.hgetall("cart_%s" % user_id)
        select_list = redis_connection.smembers("selected_%s" % user_id)
        total_price = 0  # 商品总价
        data = []
        for course_id_byte, expire_id_byte in cart_list.items():
            course_id = int(course_id_byte)
            expire_id = int(expire_id_byte)  # 过期时间
            # 商品信息
            print("商品")
            print(course_id)
            print(expire_id)
            if course_id_byte in select_list:
                try:
                    course = Course.objects.get(pk=course_id)
                except Course.DoesNotExist:
                    continue

                # 如果有效期的id大于0,则需要计算商品的价格,id不大于0,代表永久有效,需要一个默认值
                original_price = course.price
                expire_text = "永久有效"
                try:
                    if expire_id > 0:
                        course_expire = CourseExpire.objects.get(id=expire_id)
                        # 对应的价格
                        original_price = course_expire.price
                        expire_text = course_expire.expire_text
                except CourseExpire.DoesNotExist:
                    pass
                # 根据已经勾选的商品的对应的有效期的价格去计算勾选商品的最终价格
                real_expire_price = course.real_expire_price(expire_id)

                # 将购物车所需的信息返回
                data.append({
                    "course_img": constants.IMAGE_SRC + course.course_img.url,
                    "name": course.name,
                    "id": course.id,
                    "expire_text": expire_text,
                    # 活动以及有效期之后的真实价格
                    "real_price": "%.2f" % float(real_expire_price),
                    # 原价
                    "price": original_price,
                    # 活动名称
                    "discount_name": course.discount_name
                })
                # 商品叠加之后的总价格
                total_price += float(real_expire_price)

        return Response({"course_list": data, "total_price": total_price,"message": "订单页面的数据获取成功"})


class Cartdelete(ViewSet):
    def cart_delete(self, request):
        user_id = request.user.id  # 此数据可能获取不到.,暂时不需要他

        selected = request.data.get("selected")  # 获取勾选状态
        course_id = request.data.get("course_id")  # 获取商品id
        print("删除时获取到的商品的勾选状态和商品id")
        print(selected)
        print(course_id)
        # try:
        #     Course.objects.get(pk=course_id)
        # except Course.DoesNotExist:
        #     return Response({"message":"参数有误,当前购物车的商品不存在"},status=status.HTTP_400_BAD_REQUEST)
        if selected:
            # 如果状态为选中,将商品从购物车中删除
            # //连接库.待会改
            redis_connection = get_redis_connection("cart")
            # 数据保存至redis中
            pipeline = redis_connection.pipeline()
            # 开启管道
            pipeline.multi()
            # 删除指定信息
            pipeline.hdel("cart_%s" % user_id, course_id)
            # 执行命令,开始删除,不执行不删除(懒加载)
            pipeline.execute()
            return Response({"message": "删除成功"})
        else:
            # 如果没有选中,返回提示信息,请先选中再删除
            return Response({"message": "请先选中再进行删除"})
        # return Response({"message":"删除成功"})
